package com.zenithmind.coding.pojo.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;

import java.util.List;

/**
 * 创建编程问题DTO
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "创建编程问题DTO")
public class ProblemCreateDTO {

    /**
     * 问题标题
     */
    @NotBlank(message = "问题标题不能为空")
    @Size(min = 1, max = 200, message = "问题标题长度必须在1-200之间")
    @Schema(description = "问题标题", example = "两数之和")
    private String title;

    /**
     * 问题描述
     */
    @NotBlank(message = "问题描述不能为空")
    @Schema(description = "问题描述", example = "给定一个整数数组和一个目标值，找出数组中和为目标值的两个数...")
    private String description;

    /**
     * 输入说明
     */
    @Schema(description = "输入说明", example = "第一行包含数组长度n和目标值target...")
    private String inputDescription;

    /**
     * 输出说明
     */
    @Schema(description = "输出说明", example = "输出两个数的下标，用空格分隔")
    private String outputDescription;

    /**
     * 示例输入
     */
    @Schema(description = "示例输入", example = "4 9\n2 7 11 15")
    private String sampleInput;

    /**
     * 示例输出
     */
    @Schema(description = "示例输出", example = "0 1")
    private String sampleOutput;

    /**
     * 提示信息
     */
    @Schema(description = "提示信息", example = "可以使用哈希表来优化时间复杂度")
    private String hint;

    /**
     * 问题来源
     */
    @Schema(description = "问题来源", example = "LeetCode")
    private String source;

    /**
     * 问题分类ID
     */
    @NotBlank(message = "问题分类ID不能为空")
    @Schema(description = "问题分类ID", example = "1234567890")
    private String categoryId;

    /**
     * 问题标签列表
     */
    @Schema(description = "问题标签列表", example = "[\"数组\", \"哈希表\", \"双指针\"]")
    private List<String> tags;

    /**
     * 难度等级（1-简单，2-中等，3-困难，4-专家）
     */
    @NotNull(message = "难度等级不能为空")
    @Schema(description = "难度等级（1-简单，2-中等，3-困难，4-专家）", example = "1")
    private Integer difficulty;

    /**
     * 问题类型（1-算法，2-数据结构，3-数学，4-字符串，5-动态规划，6-图论）
     */
    @NotNull(message = "问题类型不能为空")
    @Schema(description = "问题类型（1-算法，2-数据结构，3-数学，4-字符串，5-动态规划，6-图论）", example = "1")
    private Integer type;

    /**
     * 时间限制（毫秒）
     */
    @Schema(description = "时间限制（毫秒）", example = "1000")
    private Integer timeLimit = 1000;

    /**
     * 内存限制（KB）
     */
    @Schema(description = "内存限制（KB）", example = "65536")
    private Integer memoryLimit = 65536;

    /**
     * 支持的编程语言列表
     */
    @Schema(description = "支持的编程语言列表", example = "[\"java\", \"python\", \"cpp\", \"javascript\"]")
    private List<String> supportedLanguages;

    /**
     * 是否特殊评判（0-否，1-是）
     */
    @Schema(description = "是否特殊评判（0-否，1-是）", example = "0")
    private Integer isSpecialJudge = 0;

    /**
     * 特殊评判代码
     */
    @Schema(description = "特殊评判代码")
    private String specialJudgeCode;

    /**
     * 是否公开（0-私有，1-公开）
     */
    @Schema(description = "是否公开（0-私有，1-公开）", example = "1")
    private Integer isPublic = 1;

    /**
     * 是否推荐（0-否，1-是）
     */
    @Schema(description = "是否推荐（0-否，1-是）", example = "0")
    private Integer isRecommend = 0;

    /**
     * 是否立即发布（0-保存草稿，1-立即发布）
     */
    @Schema(description = "是否立即发布（0-保存草稿，1-立即发布）", example = "1")
    private Integer publishNow = 1;

    /**
     * 排序值
     */
    @Schema(description = "排序值", example = "0")
    private Integer sortOrder = 0;

    /**
     * 测试用例列表
     */
    @Schema(description = "测试用例列表")
    private List<TestCaseDTO> testCases;

    /**
     * 测试用例DTO
     */
    @Data
    @Schema(description = "测试用例DTO")
    public static class TestCaseDTO {
        
        /**
         * 输入数据
         */
        @NotBlank(message = "输入数据不能为空")
        @Schema(description = "输入数据", example = "4 9\n2 7 11 15")
        private String inputData;

        /**
         * 期望输出
         */
        @NotBlank(message = "期望输出不能为空")
        @Schema(description = "期望输出", example = "0 1")
        private String expectedOutput;

        /**
         * 测试用例类型（1-样例，2-普通，3-强数据，4-边界）
         */
        @Schema(description = "测试用例类型（1-样例，2-普通，3-强数据，4-边界）", example = "1")
        private Integer type = 2;

        /**
         * 测试用例权重
         */
        @Schema(description = "测试用例权重", example = "10")
        private Integer weight = 10;

        /**
         * 是否公开（0-否，1-是）
         */
        @Schema(description = "是否公开（0-否，1-是）", example = "0")
        private Integer isPublic = 0;

        /**
         * 测试用例描述
         */
        @Schema(description = "测试用例描述", example = "基本测试用例")
        private String description;
    }
}
